#ifndef SCRIPT_INTERPRETER_H
#define SCRIPT_INTERPRETER_H

#include <string>
#include <global.h>
#include <optional>
#include "scheduler/abstract_scheduler.h"
#include "scripting/script_header.h"

namespace script
{
class ScriptInterpreterData;
/**
 * @brief:  脚本解释器，根据指定代码，解析并输出scheduler编排器
 * @author: sherlock_lht
 */
class ScriptInterpreter
{
public:
    explicit ScriptInterpreter();
    ~ScriptInterpreter();

    /**
     * @brief:  解释源代码
     * @author: sherlock_lht
     */
    std::optional<scheduler::AbstractSchedulerConstPtr> interpret(const std::string &code);

    /**
     * @brief:  解释源代码文件
     * @author: sherlock_lht
     */
    std::optional<scheduler::AbstractSchedulerConstPtr> interpretSourceFile(const std::string &file_name);

    /**
     * @brief:  设置工作目录
     * @note:   解释代码文件时，如果是相对路径，则从工作目录下寻找如果路径不存在，则设置无效
     * @author: sherlock_lht
     */
    void setWorkPath(const std::string &path);

    /**
     * @brief:  如果解释失败，获取失败信息
     * @author: sherlock_lht
     */
    ErrorInfo getErrorInfo() const;

private:
    DECLARE_DATA(ScriptInterpreter)
};

}

#endif //SCRIPT_INTERPRETER_H
